<?php
/**
 * Created by PhpStorm.
 * User: yuanxr
 * Date: 2018/6/10
 * Time: 上午8:33
 */

namespace Utility\Extend;

/**
 * /str：
 * 1、定义比较易懂的方法名称
 * 2、将php的字符串操作参数位置进行统一化处理（php的各种字符串函数的参数比较混乱）
 * 3、统一处理ascii和utf8字符，此类中的方法都已经过测试调优，无须担心utf8和ascii不兼容的问题
**/
class EString
{
    /**
     * split
     *
     * @param string $str 目标源串
     * @param string $split 分割时的中间字符串
     * @return array 字符串被分隔之后的数组
     */
    public function split(string $str, string $split)
    {
        return explode($split, $str);
    }

    /**
     * join
     *
     * @param array $arr 源数组
     * @param string $symbol 连接符号
     * @return string 将数组连接之后的字符串
     */
    public function join(array $arr, string $symbol)
    {
        return implode($symbol, $arr);
    }

    /**
     * has
     *
     * @param string $str
     * @param string $target 需要被包含的字符串
     * @return boolean 如果源串包含目标串，则返回true，否则返回false
     */
    public function has(string $str, string $target)
    {
        if (stripos($str, $target) === false) {
            return false;
        }
        return true;
    }

    /**
     * replace
     *
     * @param string $str 源字符串
     * @param string $target 被替换的目标字符串
     * @param string $replace 替换为的目标字符串，默认空字符串
     * @return string 被替换完成的源字符串
     */
    public function replace(string $str, string $target, string $replace = '')
    {
        return str_ireplace($target, $replace, $str);
    }

    /**
     * len
     *
     * @param string $str 需要计算长度的源字符串
     * @return int 字符串的长度
     */
    public function len(string $str)
    {
        return mb_strlen($str);
    }

    /**
     * repeat
     *
     * @param string $str 需要循环的源字符串
     * @param integer $repeat 需要循环的次数，默认1
     * @return string 按指定次数循环过之后的字符串
     */
    public function repeat(string $str, int $repeat = 1)
    {
        return str_repeat($str, $repeat);
    }

    /**
     * trim
     *
     * @param string $str 需要trim左右两侧非正常字符的源串
     * @return string 已经清除左右非正常字符的字符串。可以清除的非字符如下：
     *  "\0" - NULL
     *  "\t" - 制表符
     *  "\n" - 换行
     *  "\x0B" - 垂直制表符
     *  "\r" - 回车
     *  " " - 空格
     */
    public function trim(string $str)
    {
        return trim($str);
    }

    /**
     * trim_inner
     *
     * @param string $str
     * @return void
     */
    public function trim_inner(string $str)
    {
        return $this->replace($str, ' ', '');
    }

    /**
     * password
     *
     * @param string $str 需要加密成密码串的源字符串
     * @return string 先md5，再sha1之后的字符串
     */
    public function password(string $str)
    {
        return sha1(md5($str));
    }

    /**
     * chararray
     *
     * @param string $str 需要制作成array的字符串
     * @return array 将字符串的每个字符做一个元素，生成数组，并返回该数组
     */
    public function chararray(string $str)
    {
        return preg_split('/(?<!^)(?!$)/u', $str);
    }

    /**
     * truncate
     *
     * @param string $str 源字符串
     * @param integer $length 从索引0开始字符串的长度
     * @param string $omission 如果截断，则显示在字符串之后的省略符，默认'...'
     * @return string 按指定参数截断一个字符串（兼容utf-8），并返回该字符串
     */
    public function truncate(string $str, int $length, string $omission = '...')
    {
        if (mb_strlen($str, 'utf-8') > $length) {
            return mb_substr($str, 0, $length, 'utf-8') . $omission;
        }
        return $str;
    }
    
    /**
     * middle
     *
     * @param string $str 字符串源串
     * @param string $left 左侧字符或字符串
     * @param string $right 右侧字符或字符串
     * @return string 在源字符串中，取两个字符或字符串中间的字符串，并返回
     */
    public function middle(string $str, string $left, string $right)
    {
        return substr($str, stripos($str, $left) + 1, stripos($str, $right) - stripos($str, $left) - 1);
    }

    /**
     * left
     *
     * @param string $str 字符串源串
     * @param string $split 分割时的中间字符串
     * @return string 在源字符串中，取字符串从索引0至分隔字符（字符串）的内容，并返回
     */
    public function left(string $str, string $split)
    {
        return explode($split, $str)[0];
    }

    /**
     * right
     *
     * @param string $str 源字符串
     * @param string $split 分割时的中间字符串
     * @return 在源字符串中，取字符串从分隔字符（字符串）到最后一个字符内容，并返回
     */
    public function right(string $str, string $split)
    {
        $result = explode($split, $str);
        if (count($result) > 1) {
            return $result[count($result) - 1];
        }
        return '';
    }
}